home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
126-150
/
disk_149
/
less
/
src
/
prompt.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
4KB
|
221 lines
/*
* Prompting and other messages.
* There are three flavors of prompts, SHORT, MEDIUM and LONG,
* selected by the -m/-M options.
* A prompt is either a colon or a message composed of various
* pieces, such as the name of the file being viewed, the percentage
* into the file, etc.
*/
#include "less.h"
#include "position.h"
extern int pr_type;
extern int ispipe;
extern int hit_eof;
extern int new_file;
extern int sc_width;
extern char current_file[];
extern int ac;
extern char **av;
extern int curr_ac;
/*
* Prototypes for the three flavors of prompts.
* These strings are expanded by pr_expand().
*/
char *prproto[] = {
"fo", /* PR_SHORT */
"foP", /* PR_MEDIUM */
"Fobp" /* PR_LONG */
};
static char message[200];
static char *mp;
static void
setmp()
{
mp = message + strlen(message);
}
/*
* Append the name of the current file (to the message buffer).
*/
static void
ap_filename()
{
if (ispipe)
return;
strtcpy(mp, current_file, &message[sizeof(message)] - mp);
setmp();
}
/*
* Append the "file N of M" message.
*/
static void
ap_of()
{
if (ac <= 1)
return;
sprintf(mp, " (file %d of %d)", curr_ac+1, ac);
setmp();
}
/*
* Append the byte offset into the current file.
*/
static void
ap_byte()
{
POSITION pos, len;
pos = position(BOTTOM_PLUS_ONE);
if (pos == NULL_POSITION)
pos = ch_length();
if (pos != NULL_POSITION)
{
sprintf(mp, " byte %ld", (long)pos);
setmp();
len = ch_length();
if (len > 0)
{
sprintf(mp, "/%ld", (long)len);
setmp();
}
}
}
/*
* Append the percentage into the current file.
* If we cannot find the percentage and must_print is true,
* use the byte offset.
*/
static void
ap_percent(must_print)
{
POSITION pos,len;
pos = position(BOTTOM_PLUS_ONE);
len = ch_length();
if (len > 0 && pos != NULL_POSITION)
{
sprintf(mp, " (%ld%%)", (100 * (long)pos) / len);
setmp();
} else if (must_print)
ap_byte();
}
/*
* Append the end-of-file message.
*/
static void
ap_eof()
{
strcpy(mp, " (END)");
setmp();
if (curr_ac + 1 < ac)
{
sprintf(mp, " - Next: %s", av[curr_ac+1]);
setmp();
}
}
/*
* Construct a message based on a prototype string.
*/
static char *
pr_expand(proto, maxwidth)
char *proto;
int maxwidth;
{
register char *p;
mp = message;
for (p = proto; *p != '\0'; p++)
{
if (maxwidth > 0 && mp >= message + maxwidth)
{
/*
* Truncate to the screen width.
* {{ This isn't very nice. }}
*/
mp = message + maxwidth;
break;
}
switch (*p)
{
case 'f':
if (new_file)
ap_filename();
break;
case 'F':
ap_filename();
break;
case 'o':
if (new_file)
ap_of();
break;
case 'O':
ap_of();
break;
case 'b':
ap_byte();
break;
case 'p':
if (!hit_eof)
ap_percent(0);
break;
case 'P':
if (!hit_eof)
ap_percent(1);
break;
case '<':
while (*++p != '>')
{
if (*p == '\0')
{
p--;
break;
}
*mp++ = *p;
}
break;
default:
*mp++ = *p;
break;
}
}
if (hit_eof)
ap_eof();
new_file = 0;
if (mp == message)
return (NULL);
*mp = '\0';
return (message);
}
/*
* Return a message suitable for printing by the "=" command.
*/
public char *
eq_message()
{
return (pr_expand("FObp", 0));
}
/*
* Return a prompt.
* This depends on the prompt type (SHORT, MEDIUM, LONG), etc.
* If we can't come up with an appropriate prompt, return NULL
* and the caller will prompt with a colon.
*/
public char *
pr_string()
{
return (pr_expand(prproto[pr_type], sc_width-2));
}